var expression = '1*2+3*4/2-4/2', // 表达式
    operandArray = [], // 操作数数组
    operatorArray = [], // 操作符数组
    operator = [['+', 0], ['-', 0], ['*', 1], ['/', 1]], // 操作符优先级
    pointer = 0, // 指针位置
    priority = 0, // 优先级
    pToken = '', // 当前操作符
    nToken = expression.charCodeAt(pointer) - 48; // 当前操作数

if(nToken < 0 || nToken > 9) {
    // console.log('这里报错了----> ' + expression.charAt(pointer));
}else {
    operandArray.push(nToken); // 把第一个数压倒栈
    pointer = 1;
    for(;pointer < expression.length;) {
        pToken = expression.charAt(pointer); // 拿到运算符

        for(var j = 0; j < operator.length; j++) { // validate the operator 验证运算符是否有效
            if(operator[j][0] == pToken) {
                break;
            }
        }
        if(j >= operator.length) {
            break;
        }
        priority = operator[j][1]; // 拿到优先级

        nToken = expression.charCodeAt(pointer + 1) - 48; // 拿到下一个操作数
        // 下一个操作符的优先级大或者相等,而且有操作符时就开始开始计算
        while(operatorArray.length != 0 && operatorArray[operatorArray.length-1][1] >= priority) {
            // 弹栈计算
            var result;
            var stackTop = operandArray.pop();// 弹出栈顶的第一个操作数
            var stackBottom = operandArray.pop();// 弹出栈顶的第二个操作数
            var pTokenTop = operatorArray.pop()[0]; // 弹出栈顶的第一个运算符

            switch(pTokenTop) {
                case '+':
                    result = stackBottom + stackTop;
                    break;
                case '-':
                    result = stackBottom - stackTop;
                    break;
                case '*':
                    result = stackBottom * stackTop;
                    break;
                case '/':
                    result = stackBottom / stackTop;
                    break;
            }

            operandArray.push(result);
        }

        // 优先级不够压栈,向后找高优先级的运算符
        operandArray.push(nToken); // 将当前的操作数压栈
        var opPair = []; // 当前操作符和优先级的数据
        opPair[0] = pToken; // 当前操作符
        opPair[1] = priority; // 当前操作符的优先级
        operatorArray.push(opPair); // 将操作符和优先级一组压到操作符的栈中

        pointer += 2;
    }

    while(operatorArray.length != 0) { // 把压栈的值拿出来计算
        var result;
        var stackTop = operandArray.pop();// 弹出栈顶的第一个操作数
        var stackBottom = operandArray.pop();// 弹出栈顶的第二个操作数
        var pTokenTop = operatorArray.pop()[0]; // 弹出栈顶的第一个运算符

        switch(pTokenTop) {
            case '+':
                result = stackBottom + stackTop;
                break;
            case '-':
                result = stackBottom - stackTop;
                break;
            case '*':
                result = stackBottom * stackTop;
                break;
            case '/':
                result = stackBottom / stackTop;
                break;
        }

        operandArray.push(result);
    }
}

console.log(operandArray.pop());
